#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>

int g_val = 200;

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程
        int cnt = 5;
        while(1)
        {
            printf("child, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
            if(cnt == 0)
            {
                g_val = 100;
                printf("child change g_val: 200 -> 100\n");
            }
            cnt--;
        }
        
    }
    else{
        // 父进程
        while(1)
        {
            printf("father, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
        }
    }
    return 0;
}

//int un_gval;
//int init_gval=2004;
//
//int main(int argc, char *argv[], char *env[])
//{
//    printf("code addr: %p\n", main);
//    const char *str = "Hello, Linux!";
//    printf("read only char addr: %p\n", str);
//    printf("init global value addr: %p\n", &init_gval);
//    printf("uninit global value addr: %p\n", &un_gval);
//
//    char *heap1=(char*)malloc(100);
//    char *heap2=(char*)malloc(100);
//    char *heap3=(char*)malloc(100);
//    char *heap4=(char*)malloc(100);
//
//    int a = 100;
//
//    printf("heap1 addr: %p\n", heap1);
//    printf("heap2 addr: %p\n", heap2);
//    printf("heap3 addr: %p\n", heap3);
//    printf("heap4 addr: %p\n", heap4);
//
//    printf("stack addr: %p\n", &str);
//    printf("stack addr: %p\n", &heap1);
//    printf("stack addr: %p\n", &heap2);
//    printf("stack addr: %p\n", &heap3);
//    printf("stack addr: %p\n", &heap4);
//    printf("a addr: %p\n",&a);
//
//    int i = 0;
//    for(i = 0; argv[i]; i++)
//    {
//        printf("argv[%d]: %p\n", i, argv[i]);
//    }
//    for(i = 0; env[i]; i++)
//    {
//        printf("env[%d]: %p\n", i, env[i]);
//    }
//    return 0;
//}
